﻿using System;
using System.Collections.Generic;
using System.Data;
using System.Windows.Forms;
using BadgeManager.Controller;
using BadgeManager.Model;

namespace Badge_Manager.View
{
    public partial class frmElencoCorsi : Form
    {
        private ctrlCorso ctrlCorso = new ctrlCorso();
        private static frmElencoCorsi session;
        private DataTable tableCorsi = new DataTable();
        private Utente user;

        public static frmElencoCorsi Istance(Utente user)
        {
            if (session == null)
                session = new frmElencoCorsi(user);
            return session;
        }

        private frmElencoCorsi(Utente user)
        {
            InitializeComponent();
            SettaTabella();
            AggiornaGrid(null);
            this.user = user;
            SettaVisibilita(user);
        }

        #region Tabella e Datagrid

        private void SettaTabella()
        {
            tableCorsi.Columns.Add("id", typeof(Guid));
            tableCorsi.Columns.Add("Codice", typeof(string));
            tableCorsi.Columns.Add("Nome", typeof(string));
            tableCorsi.Columns.Add("Data Inizio", typeof(string));
            tableCorsi.Columns.Add("Durata Corso", typeof(string));
            tableCorsi.Columns.Add("Data Fine", typeof(string));
        }

        private void AggiornaGrid(Corso selezionato)
        {
            List<Corso> corsi = ctrlCorso.SelectAll();
            tableCorsi.Rows.Clear();
            foreach (Corso corso in corsi)
            {
                DateTime data = DateTime.MinValue;
                if (corso.DataFine != null)
                    data = (DateTime)corso.DataFine;
                tableCorsi.Rows.Add(
                    corso.Id,
                    corso.Codice,
                    corso.Nome,
                    corso.DataInizio.ToLongDateString(),
                    corso.NumeroOre,
                    corso.DataFine == null ? "" : data.ToLongDateString()
                    );
            }
            tableCorsi.DefaultView.Sort = "Data Inizio";

            corsiDataGrid.DataSource = tableCorsi;

            if (selezionato != null)
            {
                corsiDataGrid.ClearSelection();
                SelezionaRiga(corsiDataGrid, selezionato.Id);
            }
            corsiDataGrid.Columns["id"].Visible = false;
        }

        private void SelezionaRiga(DataGridView data, Guid id)
        {
            for (int i = 0; i < data.Rows.Count; i++)
            {
                if (data["id", i].Value.ToString() == id.ToString())
                {
                    data.Rows[i].Selected = true;
                    return;
                }
            }
        }

        public void AggiornaDaEsterni(Corso corso)
        {
            AggiornaGrid(corso);
        }

        #endregion Tabella e Datagrid

        #region Eventi

        private void tbnNuovo_Click(object sender, EventArgs e)
        {
            frmAggiungiCorso aggiungi = new frmAggiungiCorso(user, this, StatoForm.Nuovo);
            aggiungi.Left = 20;
            aggiungi.Top = 20;
            aggiungi.MdiParent = this.MdiParent;
            aggiungi.Show();
        }

        private void modificaBtn_Click(object sender, EventArgs e)
        {
            if (corsiDataGrid.SelectedRows.Count > 0)
            {
                if (corsiDataGrid.SelectedRows[0].Cells["id"] != null)
                {
                    Corso corso = ctrlCorso.GetCorsoById((Guid)corsiDataGrid.SelectedRows[0].Cells["id"].Value);
                    frmAggiungiCorso modifica = new frmAggiungiCorso(user, this, StatoForm.Modifica, corso);
                    modifica.Top = 20;
                    modifica.Left = 20;
                    modifica.MdiParent = this.MdiParent;
                    modifica.Show();
                }
            }
        }

        private void btnElimina_Click(object sender, EventArgs e)
        {
            if (corsiDataGrid.SelectedRows.Count > 0)
            {
                DialogResult scelta = MessageBox.Show("Vuoi eliminare la/le righa/e selezionata/e ?", "Attenzione", MessageBoxButtons.YesNo, MessageBoxIcon.Information);
                if (scelta == System.Windows.Forms.DialogResult.Yes)
                {
                    for (int i = 0; i < corsiDataGrid.SelectedRows.Count; i++)
                    {
                        if (corsiDataGrid.SelectedRows[i].Cells["id"] != null)
                        {
                            try
                            {
                                ctrlCorso.DeleteById((Guid)corsiDataGrid.SelectedRows[i].Cells["id"].Value);
                            }
                            catch (CorsoAssociatoAdAttivita ex)
                            {
                                MessageBox.Show(ex.Message + "\n Impossibile Cancellare "
                                    , "Attenzione!", MessageBoxButtons.OK, MessageBoxIcon.Error);
                                return;
                            }
                        }
                    }
                }
            }
            AggiornaGrid(null);
        }

        private void frmElencoCorsi_FormClosing(object sender, FormClosingEventArgs e)
        {
            session = null;
        }

        #endregion Eventi

        #region Metodi Vari

        private void SettaVisibilita(Utente utente)
        {
            ctrlUtente ctrlUtente = new ctrlUtente();
            if (ctrlUtente.isSuperAdmin(utente) || ctrlUtente.PuoScrivere(utente))
            {
                btnElimina.Enabled = true;
                btnModifica.Enabled = true;
                btnNuovo.Enabled = true;
            }
            else
            {
                btnElimina.Enabled = false;
                btnModifica.Enabled = false;
                btnNuovo.Enabled = false;
            }
        }

        #endregion Metodi Vari

        private void txtRicerca_TextChanged(object sender, EventArgs e)
        {
            if (string.IsNullOrEmpty(txtRicerca.Text))
            {
                tableCorsi.DefaultView.RowFilter = "";
            }
            else
            {
                string testo = txtRicerca.Text.Replace("'", "''");
                string temp = "[Codice] LIKE '%" + testo + "%' or [Nome] LIKE '%" + testo + "%'"
                        + " or [Data Inizio] LIKE '%" + testo + "%'"
                        + " or [Durata Corso] LIKE '%" + testo + "%'"
                        + " or [Data Fine] LIKE '%" + testo + "%'";
                tableCorsi.DefaultView.RowFilter = temp;
            }
        }
    }
}